package com.zhu.rtda.heap;

/**
 * 访问标志枚举，用于表示类、字段或方法的访问权限和特性。
 * 这些标志对应 class 文件中的 access_flags 字段。
 */
public enum AccessFlags {

    ACC_PUBLIC       (0x0001),
    ACC_PRIVATE      (0x0002),
    ACC_PROTECTED    (0x0004),
    ACC_STATIC       (0x0008),
    ACC_FINAL        (0x0010),
    ACC_SYNCHRONIZED (0x0020),
    ACC_BRIDGE       (0x0040),
    ACC_VARARGS      (0x0080),
    ACC_NATIVE       (0x0100),
    /**
     * （字段专用）声明为 volatile，保证可见性和有序性
     */
    ACC_VOLATILE      (0x0040),
    /**
     * （字段专用）声明为 transient，序列化时忽略
     */

    /**
     * （枚举专用）标识该类或字段是枚举的一部分
     */
    ACC_ENUM          (0x4000),
    ACC_TRANSIENT     (0x0080),
    ACC_INTERFACE    (0x0200),
    ACC_ABSTRACT     (0x0400),
    ACC_STRICT       (0x0800),
    ACC_SYNTHETIC    (0x1000);

    private final int value;

    AccessFlags(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }

    /**
     * 判断指定的访问标志是否存在于给定的 flags 中
     *
     * @param flags 访问标志位组合
     * @return 是否包含该标志
     */
    public boolean isSetIn(int flags) {
        return (flags & this.value) != 0;
    }
}
